package com.lazycat.leetcode.editor.cn;
//2023-06-11 19:45:05
//给你一个链表的头节点 head，请你编写代码，反复删去链表中由 总和 值为 0 的连续节点组成的序列，直到不存在这样的序列为止。 
//
// 删除完毕后，请你返回最终结果链表的头节点。 
//
// 
//
// 你可以返回任何满足题目要求的答案。 
//
// （注意，下面示例中的所有序列，都是对 ListNode 对象序列化的表示。） 
//
// 示例 1： 
//
// 输入：head = [1,2,-3,3,1]
//输出：[3,1]
//提示：答案 [1,2,1] 也是正确的。
// 
//
// 示例 2： 
//
// 输入：head = [1,2,3,-3,4]
//输出：[1,2,4]
// 
//
// 示例 3： 
//
// 输入：head = [1,2,3,-3,-2]
//输出：[1]
// 
//
// 
//
// 提示： 
//
// 
// 给你的链表中可能有 1 到 1000 个节点。 
// 对于链表中的每个节点，节点的值：-1000 <= node.val <= 1000. 
// 
//
// Related Topics 哈希表 链表 👍 263 👎 0

import java.util.HashMap;
import java.util.Map;

class RemoveZeroSumConsecutiveNodesFromLinkedList {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new RemoveZeroSumConsecutiveNodesFromLinkedList().new Solution();
    }

    public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
    //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeZeroSumSublists(ListNode head) {
        ListNode dummy = new ListNode(0);
        Map<Integer,ListNode> map = new HashMap<>();

        dummy.next = head;

        int prefix = 0;

        for(ListNode node = dummy;node != null;node = node.next){
            prefix += node.val; //计算前缀和
            map.put(prefix,node);
        }

        int ret = 0;
        for(ListNode node = dummy;node != null;node = node.next){
            ret += node.val;
            //删除节点
            node.next = map.get(ret).next;
        }


        return dummy.next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}